package main

import (
	"bytes"
	"embed"
	"fmt"
	"io/fs"
	"log"
	"os"
	"path/filepath"
	"text/template"
)

var embeddedTemplates embed.FS

type TemplateContext struct {
	Name string
}

func main() {
	// 获取可执行文件所在目录
	exePath, err := os.Executable()
	if err != nil {
		log.Fatal(err)
	}
	exeDir := filepath.Dir(exePath)

	// 创建目标目录
	destDir := filepath.Join(exeDir, "dist")
	if err := os.MkdirAll(destDir, 0755); err != nil {
		log.Fatal(err)
	}

	var ctx = TemplateContext{
		Name: "John Doe",
	}

	// 递归解压嵌入文件
	if err := fs.WalkDir(embeddedTemplates, "templates", func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			return err
		}

		// 构建目标路径
		relPath, _ := filepath.Rel("templates", path)
		targetPath := filepath.Join(destDir, relPath)

		if d.IsDir() {
			return os.MkdirAll(targetPath, 0755)
		}

		// 写入文件
		data, err := fs.ReadFile(embeddedTemplates, path)
		if err != nil {
			return err
		}
		renderedData, err := renderTemplate(data, ctx)
		if err != nil {
			return fmt.Errorf("failed to render %s: %w", path, err)
		}
		return os.WriteFile(targetPath, renderedData, 0644)
	}); err != nil {
		log.Fatal(err)
	}
}

// 新增模板解析函数
func renderTemplate(content []byte, ctx TemplateContext) ([]byte, error) {
	tmpl, err := template.New("").Parse(string(content))
	if err != nil {
		return nil, fmt.Errorf("template parse error: %w", err)
	}

	var buf bytes.Buffer
	if err := tmpl.Execute(&buf, ctx); err != nil {
		return nil, fmt.Errorf("template execute error: %w", err)
	}
	return buf.Bytes(), nil
}
